package arrays;

/**
 * @author LiangMu
 * @version \$Id: P17.java, v 0.1, 2023年01月03日 13:38 LiangMu Exp $$
 */
public class P17 {

    public static void main(String[] args) {
        String s = "1A man, a plan, a canal: Panama1";
        System.out.println(isPalindrome(s));
        System.out.println(isPalindrome2(s));
    }

    /**
     * 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后，短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
     * <p>
     * 字母和数字都属于字母数字字符。
     * <p>
     * 作者：力扣 (LeetCode)
     * 链接：https://leetcode.cn/leetbook/read/all-about-array/x9tqjc/
     * 来源：力扣（LeetCode）
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     *
     * @param s
     * @return
     */
    public static boolean isPalindrome(String s) {
        char[] chars = s.toCharArray();
        int i1 = 0, i2 = chars.length - 1;
        while (i1 < i2) {
            char c1 = chars[i1];
            if (!Character.isLowerCase(c1) && !Character.isUpperCase(c1)) {
                ++i1;
                continue;
            }
            char c2 = chars[i2];
            if (!Character.isLowerCase(c2) && !Character.isUpperCase(c2)) {
                --i2;
                continue;
            }
            if (Character.toLowerCase(c1) == Character.toLowerCase(c2)) {
                ++i1;
                --i2;
            } else {
                return false;
            }
        }
        return true;
    }

    public static boolean isPalindrome2(String s) {
        String s1 = s.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
        int i1 = 0, i2 = s1.length() - 1;
        while (i1 < i2) {
            if (s1.charAt(i1) == s1.charAt(i2)) {
                ++i1;
                --i2;
            } else return false;
        }
        return true;
    }
}
